package com.cykj.order.consumer;

import com.cykj.order.domain.event.OrderStatusChangeEvent;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 订单状态变更事件消费者
 * 
 * @author cykj
 * @date 2025-08-20
 */
@Component
@RocketMQMessageListener(
    topic = "order-status-change",
    consumerGroup = "order-consumer-group"
)
public class OrderStatusChangeConsumer implements RocketMQListener<OrderStatusChangeEvent> {
    
    private static final Logger logger = LoggerFactory.getLogger(OrderStatusChangeConsumer.class);
    
    @Override
    public void onMessage(OrderStatusChangeEvent event) {
        try {
            logger.info("接收到订单状态变更事件: {}", event);
            // 根据不同的状态变更执行不同的业务逻辑
            handleStatusChange(event);
            
        } catch (Exception e) {
            logger.error("处理订单状态变更事件失败: " + event, e);
            // 这里可以考虑重试或者写入失败队列
        }
    }
    
    /**
     * 根据状态变更类型处理不同的业务逻辑
     */
    private void handleStatusChange(OrderStatusChangeEvent event) {
        Integer newStatus = event.getNewStatus();
        
        switch (newStatus) {
            case 1: // 已支付待接单
                handleOrderPaid(event);
                break;
            case 2: // 已接单制作中
                handleOrderAccepted(event);
                break;
            case 3: // 配送中
                handleOrderInDelivery(event);
                break;
            case 4: // 已完成
                handleOrderCompleted(event);
                break;
            case 5: // 已取消
                handleOrderCancelled(event);
                break;
            case 6: // 已退款
                handleOrderRefunded(event);
                break;
            default:
                logger.info("订单状态变更: orderId={}, {} -> {}", 
                           event.getOrderId(), event.getOldStatusDesc(), event.getNewStatusDesc());
        }
    }
    
    /**
     * 处理订单支付成功
     */
    private void handleOrderPaid(OrderStatusChangeEvent event) {
        logger.info("订单支付成功: orderId={}, amount={}", event.getOrderId(), event.getTotalAmount());
        
        // TODO: 这里可以添加以下业务逻辑：
        // 1. 发送支付成功通知给用户
        // 2. 通知店铺有新订单
        // 3. 库存扣减
        // 4. 积分奖励等
    }
    
    /**
     * 处理订单接单
     */
    private void handleOrderAccepted(OrderStatusChangeEvent event) {
        logger.info("订单已接单: orderId={}, shopId={}", event.getOrderId(), event.getShopId());
        
        // TODO: 这里可以添加以下业务逻辑：
        // 1. 通知用户订单已接单
        // 2. 发送短信给用户
        // 3. 更新预计制作时间
        // 4. 触发小票打印（如果需要通过消息队列）
    }
    
    /**
     * 处理订单配送中
     */
    private void handleOrderInDelivery(OrderStatusChangeEvent event) {
        logger.info("订单开始配送: orderId={}, address={}", event.getOrderId(), event.getDeliveryAddress());
        
        // TODO: 这里可以添加以下业务逻辑：
        // 1. 通知用户订单已出餐
        // 2. 分配配送员
        // 3. 发送配送短信
        // 4. 更新预计送达时间
    }
    
    /**
     * 处理订单完成
     */
    private void handleOrderCompleted(OrderStatusChangeEvent event) {
        logger.info("订单已完成: orderId={}", event.getOrderId());
        
        // TODO: 这里可以添加以下业务逻辑：
        // 1. 通知用户订单已送达
        // 2. 结算店铺收入
        // 3. 发送评价邀请
        // 4. 更新用户消费记录
    }
    
    /**
     * 处理订单取消
     */
    private void handleOrderCancelled(OrderStatusChangeEvent event) {
        logger.info("订单已取消: orderId={}", event.getOrderId());
        
        // TODO: 这里可以添加以下业务逻辑：
        // 1. 库存回滚
        // 2. 优惠券回滚
        // 3. 通知用户订单取消
        // 4. 如果已支付，触发退款流程
    }
    
    /**
     * 处理订单退款
     */
    private void handleOrderRefunded(OrderStatusChangeEvent event) {
        logger.info("订单已退款: orderId={}, amount={}", event.getOrderId(), event.getTotalAmount());
        
        // TODO: 这里可以添加以下业务逻辑：
        // 1. 通知用户退款成功
        // 2. 更新财务数据
        // 3. 库存回滚（如果需要）
        // 4. 记录退款日志
    }
}
